﻿using System.Collections;
using TMPro;
using UnityEngine;
//继承MovingObject
public class Enemy : MovingObject {

    public int playerDamage; //对玩家的伤害量

    private Animator animator;
    private Transform target; //玩家的位置信息（利用于AI 寻找玩家并攻击）
    private bool skipMove; //敌人能否移动

    public AudioClip enemyAttack1;
    public AudioClip enemyAttack2;


    public GameObject Bullet;
 

    //继承MovingObject的Start方法
    protected override void Start () {

        //********** 修改开始 **********//
        // 因为Start比Awake的执行要晚，保证GameManager里的List实例化完毕后，把自己添加到
        // GameManager中被管理
        //把自己装载到GameManager脚本中的enemyies序列里 
        GameManager.instance.AddEnemyToList (this);
        //********** 修改结束 **********//

        //获取Animator
        animator = GetComponent<Animator> ();
        //先获取Player的对象再获取其transform最终我们要拿取位置信息
        target = GameObject.FindGameObjectWithTag ("Player").transform;
        //调用MovingObject的Start方法
        base.Start ();
    }
    //
    protected override void AttemptMove<T> (int xDir, int yDir) {
        // 执行两次仅有一次能执行下去 为了实现玩家动两次 敌人才动一次的效果
        if (skipMove) {
            skipMove = false;
            return;
        }

        base.AttemptMove<T> (xDir, yDir);
        //移动结束了flag


        // 作业3的提示 这里因为是敌人的回合，在尝试移动的函数之后 可以选择在这里攻击
        // Attack()需要什么参数你们自己可以想想
        // 比如是发射子弹（怎么根据方向发射子弹呢。请参考我们的第二节课 飞机大战）
        // 生成子弹对象(至少是个碰撞体)

        
        skipMove = true;
        Attack();



    }

    //敌方角色移动用方法　从GameManager调用
    public void MoveEnemy () {
        int xDir = 0;
        int yDir = 0;
        //在同一行(y轴)时
        //Mathf.Abs: 获取距离的绝对值。
        //计算玩家横向距离的绝对值 
        //如果小于0 就是在玩家正上方或者下方（float.Epsilon 科学计数法上一个无限接近0的值）

        
        if (null == this) return;

        if (Mathf.Abs(target.position.x - transform.position.x) < float.Epsilon)
            {
                //Player在上方+1、下方-1
                yDir = target.position.y > transform.position.y ? 1 : -1;
            }
            else
            {
                //Player在右侧+1、左侧的话-1
                xDir = target.position.x > transform.position.x ? 1 : -1;

                // 三元表达式
                /*int i = true ? 0 : 1;

                int i;
                if (true) {
                    i =0;
                } else {
                    i=1;
                }*/
            }
            //范型机能　攻击対象是只有Player、型的参数就是Player
            AttemptMove<Player>(xDir, yDir);
       
    }
    //必须实现MovingObject的抽象方法
    protected override void OnCantMove<T> (T component) {
        //获取Player
        Player hitPlayer = component as Player;

        //********** 修改开始 **********//
        animator.SetTrigger ("enemyAttack"); //执行攻击动画
        //********** 修改结束 **********//

        //调用Player类的LoseFood 参数是 对玩家的伤害量
        hitPlayer.LoseFood (playerDamage);
        SoundManager.instance.RandomizeSfx(enemyAttack1, enemyAttack2);
    }


   

    // 作业3的提示
    public void Attack() {
        // 生成子弹对象.....
       

        Instantiate(Bullet, transform.position, transform.rotation);
      

    }

}